//
// Created by denglibin on 2019/6/17 0017.
//

/**
 *
 *
 * std::function介绍
    类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作，
    这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹
    （我们知道像函数指针这类可调用实体，是类型不安全的）。
   通过std::function对C++中各种可调用实体（普通函数、Lambda表达式、函数指针、以及其它函数对象等）的封装，形成一个新的可调用的std::function对象；
    让我们不再纠结那么多的可调用实体。一切变的简单粗暴。
    定义格式：std::function<函数类型>
 * */

#include <functional>
#include <iostream>
using namespace std;

std::function<int(int)> fun;

//普通函数
int fun1(int a){
    return a + 2;
}
//仿函数
class Functor{
public:
    int operator()(int a){
        return a + 10;
    }
};
// 1.类成员函数
// 2.类静态函数
 class A
{
public:
    int a(int a) { return a; }
    static int b(int a) { return a; }
};


int main51(){
    //普通函数
    fun = fun1;
    cout << fun(1) <<endl;

    //lambda表达式
    fun = [](int x)->int { return  x * 2;};
    cout << fun(3) << endl;

    //仿函数
    Functor fun3;
    fun = fun3;
    cout << fun(33) << endl;

    //类成员函数
    A a;
    fun = std::bind(&A::a, a, std::placeholders::_1);
    cout << fun(234) << endl;

    //类静态函数
    fun = A::b;
    cout << fun(254) << endl;
    return 0;
}